home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / dev / misc / Gfx4PCQ.lha / WindowLib / Examples / Fractal2 / Fractal2.p < prev    next >
Encoding:
Text File  |  1997-02-09  |  2.6 KB  |  135 lines

  1. PROGRAM Fractal;
  2. {A fractal drawing demonstration program for THOR's windowlib
  3.  © 1997 THOR Software}
  4.  
  5. {$I "include:utils/windowlib.i"}
  6.     
  7. CONST
  8.     maxlevel    =    10;    {maximal level of iterations}
  9.     
  10. TYPE
  11.     {an affine mapping: apply matrix plus shift}
  12.     AffineMapping    =    RECORD
  13.         LinearMapping    :    ARRAY[1..2,1..2] OF REAL;
  14.         Movement    :    ARRAY[1..2] OF REAL;
  15.     END;
  16.     
  17.     {a point in space}
  18.     Point        =    RECORD
  19.         x        :    REAL;
  20.         y        :    REAL;
  21.     END;
  22.     
  23.     
  24. VAR
  25.     maps            :    ARRAY[1..4] OF AffineMapping;
  26.     level            :    INTEGER;
  27.     window            :    WindowPtr;
  28.     base            :    Point;
  29.     
  30.     
  31.     
  32. {apply mapping to a point}
  33. PROCEDURE MapPoint(m : AffineMapping;VAR p : Point);
  34. BEGIN
  35.     p.x:=p.x*m.LinearMapping[1][1]+p.y*m.LinearMapping[1][2]+m.Movement[1];
  36.     p.y:=p.x*m.LinearMapping[2][1]+p.y*m.LinearMapping[2][2]+m.Movement[2];
  37. END;
  38.  
  39. {plot a point}
  40. PROCEDURE PlotPoint(w : WindowPtr;p : Point);
  41. BEGIN
  42.     Color(w,1);                {choose pen}
  43.     Plot(w,p.x*384+120,-p.y*192+180);    {scale & plot the point}
  44. END;
  45.  
  46. {iterate down the tree}
  47. PROCEDURE Iterate(p : Point);
  48. VAR
  49.     psave        :    Point;
  50.     
  51. BEGIN
  52.     level:=level+1;
  53.     IF level>=maxlevel THEN
  54.         PlotPoint(window,p)
  55.     ELSE BEGIN
  56.         psave:=p;
  57.         MapPoint(maps[1],psave);
  58.         Iterate(psave);
  59.         
  60.         psave:=p;
  61.         MapPoint(maps[2],psave);
  62.         Iterate(psave);
  63.         
  64.         psave:=p;
  65.         MapPoint(maps[3],psave);
  66.         Iterate(psave);
  67.         
  68.         psave:=p;
  69.         MapPoint(maps[4],psave);
  70.         Iterate(psave);
  71.     END;
  72.     
  73.     level:=level-1;
  74. END;
  75.  
  76.  
  77. {main program}
  78. BEGIN
  79.     InitGraphics;            {setup the gfx system}
  80.     
  81.     {setup the mapping}
  82.     WITH maps[1] DO BEGIN
  83.         LinearMapping[1][1]:=0.64987;
  84.         LinearMapping[1][2]:=-0.013;
  85.         LinearMapping[2][1]:=0.013;
  86.         LinearMapping[2][2]:=0.64987;
  87.         Movement[1]:=0.175;
  88.         Movement[2]:=0.0;
  89.     END;
  90.  
  91.     WITH maps[2] DO BEGIN
  92.         LinearMapping[1][1]:=0.64948;
  93.         LinearMapping[1][2]:=-0.026;
  94.         LinearMapping[2][1]:=0.026;
  95.         LinearMapping[2][2]:=0.64948;
  96.         Movement[1]:=0.165;
  97.         Movement[2]:=0.325;
  98.     END;
  99.  
  100.  
  101.     WITH maps[3] DO BEGIN
  102.         LinearMapping[1][1]:=0.3182;
  103.         LinearMapping[1][2]:=-0.3182;
  104.         LinearMapping[2][1]:=0.3182;
  105.         LinearMapping[2][2]:=0.3182;
  106.         Movement[1]:=0.2;
  107.         Movement[2]:=0.0;
  108.     END;
  109.  
  110.     
  111.     WITH maps[4] DO BEGIN
  112.         LinearMapping[1][1]:=-0.3182;
  113.         LinearMapping[1][2]:=0.3182;
  114.         LinearMapping[2][1]:=0.3182;
  115.         LinearMapping[2][2]:=0.3182;
  116.         Movement[1]:=0.8;
  117.         Movement[2]:=0.0;
  118.     END;
  119.     
  120.     {open a window}
  121.     window:=OpenScreenWindow(NIL,0,0,640,200,2+4+8,"Fractal Generator");
  122.     IF window<>NIL THEN BEGIN
  123.         Color(window,1);        {choose pen}
  124.         base.x:=0.0;
  125.         base.y:=0.0;
  126.         level:=0;
  127.         Iterate(base);            {draw the stuff}
  128.         
  129.         WaitForClose(window);        {wait until user closes}
  130.         CloseAWindow(window);        {close the window}
  131.     END;
  132.     
  133.     ExitGraphics;                {cleanup gfx system}
  134. END.                
  135.